package com.demo.java.OD551_600.OD569;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【最大岛屿体积(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146558088
 */
public class OdMain {
    // 记录岛屿的面积
    public static int area = 0;

    public static void main(String[] args) {
        // 创建 Scanner 对象，用于读取输入
        Scanner in = new Scanner(System.in);

        // 读取矩阵的行数和列数
        int row = in.nextInt();
        int col = in.nextInt();

        // 创建一个二维数组用于存储矩阵
        int[][] matrix = new int[row][col];
        int max = Integer.MIN_VALUE;  // 用于记录最大的岛屿面积

        // 初始化岛屿矩阵，读取每个单元格的值
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                matrix[i][j] = in.nextInt();
            }
        }

        // 遍历矩阵中的每个元素
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                // 如果当前单元格是陆地
                if (matrix[i][j] > 0) {
                    area = 0;  // 每次开始计算一个新的岛屿时，重置岛屿面积
                    // 使用 DFS 计算当前岛屿的面积
                    dfs(matrix, i, j);
                    // 更新最大岛屿面积
                    max = Math.max(area, max);
                }
            }
        }

        // 输出最大岛屿的面积
        System.out.println(max);
    }

    // 深度优先搜索函数，用于计算岛屿的面积
    public static void dfs(int[][] matrix, int i, int j) {
        int row = matrix.length, col = matrix[0].length;

        // 边界检查：如果当前单元格越界或是水域，则返回
        if (i < 0 || i >= row || j < 0 || j >= col || matrix[i][j] == 0) {
            return;
        }

        // 计算当前单元格的岛屿面积
        area += matrix[i][j];
        // 将当前单元格标记为水域，避免重复访问
        matrix[i][j] = 0;

        // 递归遍历上下左右四个方向
        dfs(matrix, i - 1, j);  // 上
        dfs(matrix, i + 1, j);  // 下
        dfs(matrix, i, j - 1);  // 左
        dfs(matrix, i, j + 1);  // 右
    }
}